 
  

 






<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=194 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:08 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
<head>
 <title>
  Java Practices -> Design by Contract
 </title>
 <link rel="stylesheet" type="text/css" href="../stylesheet8.css" media="all">
 
 <link rel="shortcut icon" href='../images/favicon.ico' type="image/vnd.microsoft.icon">
 <meta name="description" content="Concise presentations of java programming practices, tasks, and conventions, amply illustrated with syntax highlighted code examples.">
 
 <meta name='keywords' content='java,java programming,java practices,java idiom,java style,java design patterns,java coding conventions,'>
 
 
</head>
 
<body>


<div class='menu-bar'>
 
  <a href='../home/HomeAction.html' title='Table of Contents'>Home</a> |
  <a href='../vote/VoteSummaryAction-2.html' title='View Poll Results'>Poll</a> |
   
  <A href='../feedback/FeedbackAction451f-2.html?Operation=Show' title='Send Your Feedback'>Wiki</a> |
  <b><a href='../source/SourceAction-2.html' title='Grab Source Code'>Source Code</a></b><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |

  <a href='http://www.web4j.com/Java_Web_Application_Framework_Overview.jsp?From=1' title='Free Download - Java Web Application Framework'><b>WEB4J</b></a> |
  
  <a href='http://www.date4j.net/' title='Replacement for java.util.Date'><b>DATE4J</b></a> |

   <a href='../references/ReferencesAction-2.html' title='References'>Links</a>
   
  <form action='http://www.javapractices.com/search/SearchAction.do' method='get' class='search-form'>
   <input type='text' name='SearchTerms' value="" size=12 maxlength=50 class='search'>
   <input type='submit' value="Search">
  </form>
 
</div>

<P>



  

 






<p class="display-messages">

 

 

</p>


<div class="main-layout">
 
   

 




<div class='page-title'>Design by Contract</div>

<div class='main-body'>
 
<br>The specification of a class or interface is the collection of non-private
items provided as services to the caller, along with instructions for their
use, as stated in javadoc. It is a challenge to construct a specification
which
<ul>
<li>
is as simple as possible</li>

<li>
is as clear as possible</li>

<li>
has no ambiguity</li>

<li>
is completely accurate</li>

<li>
allows the reader to completely ignore implementation details (unless there
is a bug)</li>

<li>
pours understanding into the mind of the reader as quickly as possible,
with little chance for misunderstanding</li>
</ul>
Design By Contract is an effective guideline of lasting value for creating
a specification.
<p>The fundamental idea of Design By Contract is to treat the services
offered by a class or interface as a contract between the class (or interface)
and its caller. Here, the word "contract" is meant to convey a kind of
formal, unambiguous agreement between two parties.&nbsp; <i>C++ FAQs</i>
describes a contract as being made of two parts :
<ul>
<li>
<i>requirements</i> upon the caller made by the class</li>

<li>
<i>promises</i> made by the class to the caller</li>
</ul>
If the caller fulfills the requirements, then the class promises to deliver
some well-defined service.
<p>Some changes to a specification/contract will break the caller, and
some won't. For determining if a change will break a caller, <i>C++ FAQs</i>
uses the memorable phrase "<span class="highlight">require no more, promise no less</span>" : if
the new specification does not require more from the caller than before,
and if it does not promise to deliver less than before, then the new specification
is compatible with the old, and will not break the caller.
<p>Although Design By Contract is a formal part of some programming languages,
such as Eiffel, it is not a formal part of Java. Nevertheless, Design By
Contract is very useful for designing classes and interfaces. It can both
guide the discovery of a more robust design, and allow more effective expression
of that design in javadoc.
<p>Requirements are simply any conditions on use, for example
<ul>
<li>
conditions on argument values</li>

<li>
conditions on order of execution of methods</li>

<li>
condtions on execution in a multi-threaded environment</li>
</ul>
Requirements must be stated in javadoc, and may be enforced by throwing
checked or unchecked exceptions when the stated conditions are violated.&nbsp;
Using assertions for enforcing requirements is <a href="TopicActionbf65-2.html">not
recommended</a>.
<p>Promises are stated in javadoc. They can be enforced by <a href="../home/HomeAction.html#Assertions">assertions</a>
at the end of a method.
<br>
<br>

</div>




<div class='topic-section'>See Also :</div>
<div class='main-body'>
 
  
  <a href='TopicActionebc1-2.html?Id=60'>Use javadoc liberally</a> <br>
 
  
  <a href='TopicAction59d6-2.html?Id=74'>Construct classes from the outside in</a> <br>
 
  
  <a href='TopicActionfbf8-2.html?Id=102'>Assert use cases</a> <br>
 
</div>


<div class='topic-section'>Would you use this technique?</div>
<div class='main-body'>
  
  <form action="http://www.javapractices.com/vote/AddVoteAction.do" method='post'>
    Yes<input type='radio' name='Choice' value='Y' >
    &nbsp;&nbsp;No<input type='radio' name='Choice' value='N'>
    &nbsp;&nbsp;Undecided<input type='radio' name='Choice' value="?" >
    &nbsp;&nbsp;<input type=submit value="Vote" >
    <input type='hidden' name='Operation' value='Apply'>
    <input type='hidden' name='TopicId' value='194'>
  </form>
</div>

<div style='height:10.0em;'></div>

 
 
</div>

  

 





<div align='center' class='legalese'>  
&copy; 2011 Hirondelle Systems |
<a href='../source/SourceAction-2.html'><b>Source Code</b></a><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |
<a href="mailto:webmaster@javapractices.com">Contact</a> |
<a href="http://creativecommons.org/licenses/by-nc-sa/1.0/">License</a> |
<a href='../apps/cjp.rss'>RSS</a>
<!-- ukey="2AC36CD2" -->
<!-- ckey="16DF3D87" -->
<br>

 Individual code snippets can be used under this <a href='../LICENSE.txt'>BSD license</a> - Last updated on June 6, 2010.<br>
 Over 150,000 unique IPs last month - <span title='Java Practices 2.6.5, Mon May 16 00:00:00 EDT 2011'>Built with</span> <a href='http://www.web4j.com/'>WEB4J</a>.<br>
 - In Memoriam : Bill Dirani -
</div>

<script src="../../www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2633428-1";
urchinTracker();
</script>



</body>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=194 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:08 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
</html>
